home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / C / Applications / Python 1.3.3 / Python 133 SRC / Demo / www / wwwhunt.py < prev    next >
Text File  |  1996-03-12  |  3KB  |  119 lines

  1. #! /usr/local/bin/python
  2.  
  3. # Do a breadth-first search of all HTML documents reachable from a given point.
  4.  
  5. import sys
  6. import regex
  7. import dbm
  8. import os
  9. import string
  10. import wwwlib
  11. import htmllib
  12.  
  13. flush = sys.stdout.flush
  14.  
  15. stripprog = regex.compile('?.*\|#')
  16.  
  17. stoplist = []
  18.  
  19. def initstoplist(file):
  20.     f = open(file, 'r')
  21.     while 1:
  22.         line = f.readline()
  23.         if not line: break
  24.         line = string.strip(line)
  25.         if line and line[0] <> '#':
  26.             stoplist.append(regex.compile(line))
  27.     f.close()
  28.  
  29. def main():
  30.     debug = 0
  31.     while sys.argv[1:] and sys.argv[1] == '-d':
  32.         debug = debug + 1
  33.         del sys.argv[1]
  34.     initstoplist('stop.wwwhunt')
  35.     done = dbm.open('@done', 'rw', 0666)
  36.     errs = dbm.open('@errs', 'rw', 0666)
  37.     stop = dbm.open('@stop', 'rw', 0666)
  38.     todo = dbm.open('@todo', 'rw', 0666)
  39.     othr = dbm.open('@othr', 'rw', 0666)
  40.     for addr in sys.argv[1:]:
  41.         todo[addr] = '(from command line)'
  42.     while 1:
  43.         todolist = todo.keys()
  44.         if not todolist:
  45.             print 'Done!'
  46.             try: os.unlink('@todo.dir')
  47.             except os.error: pass
  48.             try: os.unlink('@todo.pag')
  49.             except os.error: pass
  50.             break
  51.         print 'Next round:', len(todolist), 'addresses to try'
  52.         for addr in todolist:
  53.             bad = 0
  54.             for prog in stoplist:
  55.                 if prog.search(addr) >= 0:
  56.                     bad = 1
  57.                     break
  58.             if bad:
  59.                 if debug: print 'Stop!', addr
  60.                 stop[addr] = todo[addr]
  61.                 del todo[addr]
  62.                 continue
  63.             if debug: print 'Fetching', addr, '...',; flush()
  64.             try:
  65.                 data = wwwlib.get_document(addr)
  66.                 if debug: print 'ok.'; flush()
  67.             except wwwlib.BadAddress, msg:
  68.                 if not debug: print addr, ':',
  69.                 print msg; flush()
  70.                 errs[addr] = todo[addr] + '\t' + msg
  71.                 del todo[addr]
  72.                 continue
  73.             if debug: print 'Parsing ...',; flush()
  74.             p = htmllib.CollectingParser()
  75.             p.feed(data)
  76.             p.close()
  77.             if debug: print 'ok.', p.title; flush()
  78.             data = todo[addr]
  79.             if p.title: data = data + '\t' + p.title
  80.             done[addr] = data
  81.             for href in p.anchors:
  82.                 if debug > 2: print 'Original:', href
  83.                 i = stripprog.search(href)
  84.                 if i >= 0:
  85.                     href = href[:i]
  86.                 if not href:
  87.                     if debug > 2: print 'Local:', href
  88.                     continue
  89.                 href = wwwlib.full_addr(addr, href)
  90. ##                if href[:5] <> 'http:':
  91. ##                    if debug > 1: print 'Not http:', href
  92. ##                    othr[href] = addr
  93. ##                    continue
  94.                 if href in todolist:
  95.                     if debug > 1:
  96.                         print 'In todolist:', href
  97.                     continue
  98.                 bad = 0
  99.                 for prog in stoplist:
  100.                     if prog.search(href) >= 0:
  101.                         bad = 1
  102.                         break
  103.                 if bad:
  104.                     if debug > 1: print 'Stop:', href
  105.                     stop[href] = addr
  106.                     continue
  107.                 if todo.has_key(href):
  108.                     if debug > 1: print 'In todo:', href
  109.                     continue
  110.                 if done.has_key(href):
  111.                     if debug > 1: print 'In done:', href
  112.                     continue
  113.                 if debug > 1: print 'New:', href
  114.                 todo[href] = addr
  115.             del todo[addr]
  116.  
  117.  
  118. main()
  119.